R & Vador

Libère ta colère
Utilise le Web scraping

Contexte

  • Récupérer des données sur internet permet
  •       Garder des historiques
  •       Enrichir ses analyses
  •       Suivre la concurrence

Etude de cas

Qui sont les principaux actionnaires
du DAX30 (indice boursier allemand)?

Commençons par une entreprise

  • Trouver les principaux actionnaires de Volkswagen

Volkswagen

marketscreener.com > Market > Index > DAX

Volkswagen

Choisir Volkswagen

Volkswagen

Cliquer sur Company

Volkswagen

Les détails de l’entreprise

Volkswagen

Récupérer le tableau des actionnaires

Effectuer cette action pour les 30 entreprises du DAX30

Le Web scraping peut automatiser cette tâche

Rappel

Structure des pages web




Utilisation de {rvest}

  • Recherche d’éléments via sélecteur HTML
  • Recherche d’éléments via sélecteur CSS

library(dplyr)
library(stringr)
library(magrittr)
library(rvest)

# Recherche des liens sur la page marketscreener > DAX30
list_component<- read_html('https://www.marketscreener.com/dax30/company/') %>% 
    html_nodes('.center+ td a') %>% 
    html_attr('href')

# Visualisation des 8 premiers liens
head(list_component, 8)
## [1] "/news/latest/Global-Markets-Asian-shares-buoyed-by-China-optimism-markets-eye-U-S-presidential-debate--31367174/"
## [2] "/news/latest/Asian-shares-buoyed-by-China-optimism-markets-eye-U-S-presidential-debate--31367853/"               
## [3] "/news/latest/Stocks-set-for-dire-week-best-for-dollar-since-April--31358570/"                                    
## [4] "/quote/stock/LINDE-PLC-46923083/"                                                                                
## [5] "/quote/stock/SAP-SE-436555/"                                                                                     
## [6] "/quote/stock/SIEMENS-AG-56358595/"                                                                               
## [7] "/quote/stock/ALLIANZ-SE-436843/"                                                                                 
## [8] "/quote/stock/BAYER-AG-436063/"

Filtre sur les liens ayant quote/stock/

list_component %<>% 
  str_subset('quote/stock/')

Les 3 plus grands actionnaires de LINDE

x <- list_component[1]
url <- paste0('https://www.marketscreener.com',x,'company/')
read_page <- read_html(url)

# Extraction du tableau
df_stocks <- read_page %>% 
  html_nodes('table .nfvtTab')  %>% 
  .[5] %>% 
  html_table(fill=TRUE) %>% 
  .[[1]]

# Nettoyer le tableau
df_stocks %>% 
  rename(Name=X1, Equities=X2, Hold=X3) %>% 
  filter(row_number()>1) %>% 
  head(3)

Répeter le processus pour les 30 valeurs du DAX30

Création de fonction

extract_holders <- function(x){
  url <- paste0('https://www.marketscreener.com',x,'company/')
  
  # Lecture la page
  read_page <- read_html(url)
  
  # Extraction du tableau
  df_stocks <- read_page %>% 
    html_nodes('table .nfvtTab')  %>% 
    .[5] %>% 
    html_table(fill=TRUE) 
  
  # Nettoyage du tableau
  df_stocks[[1]] %>% 
    rename(Name=X1, Equities=X2, Hold=X3) %>% 
    filter(row_number()>1)
}

Utilisation de la fonction

df_all <- tibble(link = list_component) %>% 
  mutate(holders=map(link, extract_holders))

Répondons à la question

  • Qui sont les principaux actionnaires du DAX30?

Code associé

df_all_new <- df_all %>% 
  unnest() %>% 
  mutate(montant = str_remove_all(Equities, ',') %>% as.numeric) %>% 
  group_by(Name) %>% 
  summarise(Montant_total=sum(montant)) %>% 
  arrange(desc(Montant_total)) %>% 
  head(10)


ggplot(df_all_new, 
       aes(x=reorder(Name, Montant_total), y=Montant_total)) +
  geom_bar( stat='identity', fill= c('#6891d0',rep('#b2b4b7',9))) +
  geom_text(aes(label=paste(format(round(Montant_total/10^6,0),big.mark=" ", big.interval=3L),' '), y=(Montant_total-8*10^7)), # color=c( '#b2b4b7','#6891d0'),
            fontface = "bold", color = "#ffffff")  +
  coord_flip() +
  ggtitle('Le gouvernement allemand soutient ses leaders') +
  ylab("Participation au capital des valeurs du DAX30 (en millions d'euros)") + 
  #ylab("Montant (millions de dollars)")
  xlab(" ") +
  labs(caption = "source: www.marketscreener.com", color= 'grey')+
  theme_bw() +
  theme(plot.title = element_text(lineheight = 1.1,size = 20,  hjust = 0.5),
        plot.subtitle = element_text(lineheight = 1.1,  hjust = 0.5),
        plot.caption = element_text(color = "grey", face = "italic"),
        panel.grid.minor = element_blank(),
        panel.grid.major = element_blank(),
        panel.border = element_blank(),
        axis.line.x = element_blank(),
        axis.text.x=element_blank(),
        axis.text.y=element_text(lineheight = 1.5),
        axis.ticks.x =element_blank(),
        axis.ticks.y =element_blank(),
        legend.position = 'none'
  )

On peut visualiser les données autrement

Relations entre les principaux actionnaires
et les entreprises

Récapitulatif

Avec {rvest}

Utilise les fonctions suivantes pour récupérer des données

  • read_html(url)
  • html_nodes(code html)
  • html_attr(css) (option)
  • html_text() ou html_table()

Merci pour votre attention

Questions?